package pers.jl.filter;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import pers.jl.common.BaseContext;
import pers.jl.common.R;
import pers.jl.utils.Utils;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 检查用户是否已经完成登录
 */
@WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")
@Slf4j
public class LoginCheckFilter implements Filter{

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 强转一下
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        //1、获取本次请求的URI
        String requestURI = request.getRequestURI();// /backend/index.html

        //定义不需要处理的请求路径
        String[] urls = new String[]{
                // 员工登录和退出登录请求
                "/employee/login",
                "/employee/logout",
                // 用户登录和退出登录请求和验证码发送请求
                "/user/login",
                "/user/logout",
                "/user/code/*",
                // 静态资源
                "/backend/**",
                "/front/**",
                // Swagger
                "/doc.html",
                "/webjars/**",
                "/swagger-resources",
                "/v2/api-docs"
        };

        //2、判断本次请求是否需要拦截处理
        boolean check = Utils.check(urls, requestURI);

        //3、如果不需要处理，则直接放行
        if(check){
            filterChain.doFilter(request,response);
            // 退出方法
            return;
        }

        //4、如果请求资源需要登录才能访问，则要判断登录状态(员工)
        // 如果已登录，则直接放行
        if(request.getSession().getAttribute("employeeId") != null){
            // 用户登录后，将id存入这个线程的线程变量中
            BaseContext.setCurrentId((Long) request.getSession().getAttribute("employeeId"));
            filterChain.doFilter(request,response);
            return;
        }

        //5、如果请求资源需要登录才能访问，则要判断登录状态(用户)
        // 如果已登录，则直接放行
        if(request.getSession().getAttribute("userId") != null){
            // 只要登录成功，后续操作都在一个线程中，共享线程变量
            // 需要将用户id设置到线程变量中，公共字段自动填充需要使用。
            BaseContext.setCurrentId((Long) request.getSession().getAttribute("userId"));
            // 直接放行
            filterChain.doFilter(request,response);
            return;
        }

        log.info("用户未登录");
        //6、如果未登录则返回未登录结果，通过输出流方式向客户端页面响应数据
        // 根据前端的响应拦截器接收结果来定义的
        response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
        return;
    }
}
